package com.example.emos.wx.controller;

import cn.hutool.core.date.DateUtil;
import com.example.emos.wx.common.util.R;
import com.example.emos.wx.config.shiro.JwtUtil;
import com.example.emos.wx.controller.form.CheckinForm;
import com.example.emos.wx.exception.EmosException;
import com.example.emos.wx.service.CheckinService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import cn.hutool.core.io.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Date;
import java.util.HashMap;

// 指定该控制器处理的请求路径为"/checkin"
@RequestMapping("/checkin")
// 标记该类为一个RESTful控制器，返回的数据直接写入HTTP响应体中
@RestController
// 为该控制器提供API文档，描述为"签到模块Web接口"
@Api("签到模块Web接口")
// 使用Lombok的Slf4j注解，自动生成日志对象log
@Slf4j
public class CheckinController {

	// 自动注入JwtUtil对象，用于处理JWT令牌相关的操作
	@Autowired
	private JwtUtil jwtUtil;

	// 自动注入CheckinService对象，用于处理考勤相关的业务逻辑
	@Autowired
	private CheckinService checkinService;

	@Value("${emos.image-folder}")  // 从配置文件中读取emos.image-folder属性的值，并注入到imageFolder变量中
	private String imageFolder;

	/**
	 * 检查用户是否可以签到
	 * @param token
	 * @return
	 */
	// 处理GET请求，请求路径为"/checkin/validCanCheckIn"
	@GetMapping("/validCanCheckIn")
	// 为该接口提供API文档，描述为"查看用户今天是否可以签到"
	@ApiOperation("查看用户今天是否可以签到")
	// 从请求头中获取名为"token"的参数
	public R validCanCheckIn(@RequestHeader("token") String token) {
		// 使用JwtUtil对象从token中提取用户ID
		int userId = jwtUtil.getUserId(token);
		// 使用CheckinService对象检查用户是否可以签到
		String result = checkinService.validCanCheckIn(userId, DateUtil.today());
		// 返回一个R对象，表示成功，并包含检查结果
		return R.ok(result);
	}

	@PostMapping("/checkin")
	@ApiOperation("签到")
	public R checkin(@Valid CheckinForm form, @RequestParam("photo")MultipartFile file,@RequestHeader("token") String token ){
		if (file == null) {  // 检查是否上传了文件，如果没有，返回错误信息
			return R.error("没有上传文件");
		}

		int userId = jwtUtil.getUserId(token);  // 解析token获取用户ID
		String fileName = file.getOriginalFilename().toLowerCase();  // 获取上传文件的原始文件名，并转换为小写

		if(!fileName.endsWith((".jpg"))){
			return R.error("必须提交JPG格式图片");
		}else {
			// 构建图片保存的路径
			String path = imageFolder + "/" + fileName;

			try {
//				将上传的文件保存到指定路径
				file.transferTo(Paths.get(path));
				HashMap param = new HashMap();
				param.put("userId", userId);  // 将参数放入Map中
				param.put("path", path);
				param.put("city", form.getCity());
				param.put("district", form.getDistrict());
				param.put("address", form.getAddress());
				param.put("country", form.getCountry());
				param.put("province", form.getProvince());
				checkinService.checkin(param);  // 调用签到服务的方法进行签到处理
				return R.ok("签到成功");  // 返回签到成功信息

			} catch (IOException e) {
				log.error(e.getMessage(), e);  // 记录异常信息
				throw new EmosException("图片保存错误");  // 抛出自定义异常
			}finally {
				FileUtil.del(path);  // 无论如何都要删除临时文件
			}

		}

	}

}

